﻿//@模块名称 模拟器操作
//@版本 1.0
//@日期 2024-11-06
//@作者 菜鸟
//@QQ 84002751
//@模块备注 封装说明:
//   ● 封装自原版雷电模拟器的"ldconsole.exe"和"ld.exe",仅简化了命令行操作,ld操作类带前缀ld_
//   ● 为更接近原生,所有函数的返回值、参数均为文本型,返回值均为命令行执行结果(大多数执行成功返回值为空)
//   ● 全局函数类中提供了2个文本转换函数,可将list()函数获取的窗口句柄和PID转换成C++标准的HWND和DWORD

//说明：本模块只用作技术研究，不针对任何使用场景，用本模块制作的任何软件和本人无关。
//@依赖 "module_base.h"

#外部类型 STARTUPINFOW
#外部类型 PROCESS_INFORMATION
#外部类型 SECURITY_ATTRIBUTES

结构体 雷电模拟器信息
	文本型 索引
	文本型 名称
	文本型 模拟器句柄
	文本型 绑定句柄
	文本型 状态
	文本型 模拟器PID
	文本型 虚拟机PID
	文本型 宽度
	文本型 高度
	文本型 DPI

类 全局函数类
	私有

	公开

	函数 构造()
		占位

	函数 析构()
		占位

	//@备注 注意:该命令会阻塞,一直到cmd中的内容执行完毕后才会返回
	//@参数 命令行文本,如"ipconfig"
	//@返回 返回:执行后的所有结果信息文本,与CMD执行后的输出结果一致
	函数 文本型 取DOS执行结果(禁引用 文本型 参_DOS命令)
		句柄型 局_读入管道句柄 = 空
		句柄型 局_写出管道句柄 = 空
		参_DOS命令 = "cmd.exe /c " + 参_DOS命令
		SECURITY_ATTRIBUTES 局_安全属性 = {取类型大小(SECURITY_ATTRIBUTES), 空, 真}
		逻辑型 局_创建管道结果
		// 创建一个无缓冲的管道，用来接收命令执行的输出
		#嵌入行 局_创建管道结果 = CreatePipe(&局_读入管道句柄,&局_写出管道句柄,&局_安全属性,0);
		如果 (!局_创建管道结果)
			返回 "创建管道失败!"
		// 设置启动信息以隐藏窗口
		STARTUPINFOW 局_启动信息 = {取类型大小(STARTUPINFOW)}
		#嵌入代码
		局_启动信息.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
		局_启动信息.wShowWindow = SW_HIDE;
		局_启动信息.hStdOutput = 局_写出管道句柄;
		局_启动信息.hStdError = 局_写出管道句柄;
		#嵌入代码_结束
		PROCESS_INFORMATION  局_进程信息
		逻辑型 局_创建进程结果
		// 创建进程执行DOS命令
		#嵌入行 局_创建进程结果 = CreateProcessW(NULL,(LPWSTR)参_DOS命令.getPtr(),NULL,NULL,TRUE,CREATE_NO_WINDOW,NULL,NULL,&局_启动信息,&局_进程信息);
		如果 (!局_创建进程结果)
			#嵌入代码
			CloseHandle(局_读入管道句柄);
			CloseHandle(局_写出管道句柄);
			#嵌入代码_结束
			返回 "创建进程失败!"
		#嵌入行 CloseHandle(局_写出管道句柄);
		// 读取命令执行结果
		字符型A 局_缓冲区[512]
		DWORD 局_读取字节数
		文本型A 局_读取文本结果 = ""
		逻辑型 局_读取是否成功
		循环 (真)
			#嵌入行 局_读取是否成功 = ReadFile(局_读入管道句柄,局_缓冲区,511,&局_读取字节数,NULL);
			如果 (局_读取是否成功 && 局_读取字节数 > 0)
				局_缓冲区[局_读取字节数] = '\0'
				局_读取文本结果.添加(局_缓冲区)
			否则
				跳出
		// 清理资源
		#嵌入代码
		CloseHandle(局_读入管道句柄);
		CloseHandle(局_进程信息.hThread);
		CloseHandle(局_进程信息.hProcess);
		#嵌入代码_结束
		返回 A2W(局_读取文本结果)

	//@备注 主要用于将文本型窗口句柄转换成C++标准的HWND型
	函数 HWND 文本转换_到HWND(禁引用 文本型 参_待转换文本)
		HWND 局_返回值
		#嵌入行 局_返回值 = reinterpret_cast<HWND>(strtoull(W2A(参_待转换文本).getPtr(), nullptr, 10));
		返回 局_返回值

	//@备注 主要用于将文本型PID转换成C++标准的ProcessID的数据类型
	函数 DWORD 文本转换_到DWORD(禁引用 文本型 参_待转换文本)
		DWORD 局_返回值
		#嵌入行 局_返回值 = static_cast<DWORD>(strtoul(W2A(参_待转换文本).getPtr(), nullptr, 10));
		返回 局_返回值

	占位

类 雷电模拟器操作类
	私有
	全局函数类 x
	文本型 路径
	文本型 ld路径

	公开
	函数 构造()
		占位

	函数 析构()
		占位

	//@备注 设置模拟器ldconsole.exe文件所在路径
	//@参数 如-R"(D:\LDPlayer9\ldconsole.exe)"或"D:\\LDPlayer9\\ldconsole.exe"
	//@返回 返回设置成功的路径,如"D:\\LDPlayer9\\ldconsole,D:\\LDPlayer9\\ld"
	函数 禁引用 文本型 初始化(禁引用 文本型 参_模拟器路径) : init
		路径 = 文本取左边(参_模拟器路径.取地址(), 参_模拟器路径.取大小() - 4)
		路径 = 路径 + " "
		ld路径 = 文本取左边(参_模拟器路径.取地址(), 参_模拟器路径.取大小() - 11)
		ld路径 = ld路径 + " "
		返回 路径 + "," + ld路径

	//@参数 优先匹配项,可空,如为空则根据索引关闭模拟器
	//@参数 可空,参数1为空则匹配该参数
	//@备注 关闭指定的模拟器,参数可用list()获取
	函数 禁引用 文本型 模拟器关闭(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : quit
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "quit --index " + 参_模拟器索引)
		否则
			返回 x.取DOS执行结果(路径 + "quit --name " + 参_模拟器名称)

	//@备注 关闭所有模拟器
	函数 禁引用 文本型 模拟器关闭全部() : quitall
		返回 x.取DOS执行结果(路径 + "quitall")

	//@参数 优先匹配项,可空,如为空则根据索引启动模拟器
	//@参数 可空,参数1为空则匹配该参数
	//@备注 启动指定的模拟器,参数可用list()获取
	函数 禁引用 文本型 模拟器启动(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : launch
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "launch --index " + 参_模拟器索引)
		否则
			返回 x.取DOS执行结果(路径 + "launch --name " + 参_模拟器名称)

	//@参数 优先匹配项,可空,如为空则根据索引重启模拟器
	//@参数 可空,参数1为空则匹配该参数
	//@备注 重启指定的模拟器,参数可用list()获取
	函数 禁引用 文本型 模拟器重启(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : reboot
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "reboot --index " + 参_模拟器索引)
		否则
			返回 x.取DOS执行结果(路径 + "reboot --name " + 参_模拟器名称)

	//@参数 接受返回结果的动态数组指针,如:
	//动态数组<雷电模拟器信息> a
	//参数填:&a
	//@备注 遍历模拟器信息,信息中的状态0=未启动,1=已启动,2=启动中
	函数 禁引用 文本型 模拟器遍历信息(禁引用 动态数组<雷电模拟器信息>* 参_模拟器信息数组指针) : list2
		动态数组<雷电模拟器信息> 局_返回模拟器信息数组
		局_返回模拟器信息数组.清空()
		文本型 局_执行结果 = x.取DOS执行结果(路径 + "list2")
		动态数组<文本型> 局_行文本数组 = 文本分割行(局_执行结果.取地址())
		动态数组<文本型> 局_模拟器信息数组
		雷电模拟器信息 局_模拟器信息
		列表循环 (整型 i = 0; 局_行文本数组)
			局_模拟器信息数组.清空()
			局_模拟器信息数组 = 文本分割(局_行文本数组[i].取地址(), ",")
			如果 (局_模拟器信息数组.取大小() ==10)
				局_模拟器信息.索引 = 局_模拟器信息数组[0]
				局_模拟器信息.名称 = 局_模拟器信息数组[1]
				局_模拟器信息.模拟器句柄 = 局_模拟器信息数组[2]
				局_模拟器信息.绑定句柄 = 局_模拟器信息数组[3]
				局_模拟器信息.状态 = 局_模拟器信息数组[4]
				局_模拟器信息.模拟器PID = 局_模拟器信息数组[5]
				局_模拟器信息.虚拟机PID = 局_模拟器信息数组[6]
				局_模拟器信息.宽度 = 局_模拟器信息数组[7]
				局_模拟器信息.高度 = 局_模拟器信息数组[8]
				局_模拟器信息.DPI = 局_模拟器信息数组[9]
				局_返回模拟器信息数组.添加(局_模拟器信息)
		*参_模拟器信息数组指针 = 局_返回模拟器信息数组
		返回 局_执行结果

	//@参数 接受返回结果的动态数组,如:
	//动态数组<文本型> a
	//参数填:&a
	//@备注 遍历当前正在运行的模拟器名称
	函数 禁引用 文本型 模拟器遍历当前运行(禁引用 动态数组<文本型>* 参_模拟器名称数组指针) : runninglist
		文本型 局_执行结果 = x.取DOS执行结果(路径 + "runninglist")
		动态数组<文本型> 局_文本数组 = 文本分割行(局_执行结果)
		列表循环 (整型 i = 0; 局_文本数组)
			如果 (局_文本数组[i] != "")
				(*参_模拟器名称数组指针).添加(局_文本数组[i])
		返回 局_执行结果

	//@备注 在运行返回"running",没在运行返回"stop"
	函数 禁引用 文本型 模拟器是否在运行(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : isrunning
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "isrunning --index " + 参_模拟器索引)
		否则
			返回 x.取DOS执行结果(路径 + "isrunning --name " + 参_模拟器名称)

	//@备注 雷电多开器的"新建"功能
	函数 禁引用 文本型 模拟器添加(禁引用 文本型 参_模拟器名称) : add
		返回 x.取DOS执行结果(路径 + "add --name " + 参_模拟器名称)

	//@参数 如目标模拟器名称不存在,则会自动新建
	//@参数 优先匹配项,可空,如为空则根据索引复制
	//@参数 可空,参数1为空则匹配该参数
	//@备注 雷电多开器的"添加模拟器-复制"功能
	函数 禁引用 文本型 模拟器复制(禁引用 文本型 参_目标模拟器名称, 禁引用 文本型 参_源模拟器名称 = "", 禁引用 文本型 参_源模拟器索引 = "") : copy
		如果 (参_源模拟器名称 == "" && 参_源模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_源模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "copy --name " + 参_目标模拟器名称 + " --from " + 参_源模拟器索引)
		否则
			返回 x.取DOS执行结果(路径 + "copy --name " + 参_目标模拟器名称 + " --from " + 参_源模拟器名称)

	//@参数 优先匹配项,可空,如为空则根据索引移除模拟器
	//@参数 可空,参数1为空则匹配该参数
	//@备注 移除指定的模拟器,参数可用list()获取
	函数 禁引用 文本型 模拟器移除(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : remove
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "remove --index " + 参_模拟器索引)
		否则
			返回 x.取DOS执行结果(路径 + "remove --name " + 参_模拟器名称)

	//@参数 更换后的模拟器名称
	//@参数 优先匹配项,可空,如为空则根据索引匹配
	//@参数 可空,参数1为空则匹配该参数
	函数 禁引用 文本型 模拟器重命名(禁引用 文本型 参_新名称, 禁引用 文本型 参_源模拟器名称 = "", 禁引用 文本型 参_源模拟器索引 = "") : rename
		如果 (参_源模拟器名称 == "" && 参_源模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_源模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "rename --index " + 参_源模拟器索引 + " --title " + 参_新名称)
		否则
			返回 x.取DOS执行结果(路径 + "rename --name " + 参_源模拟器名称 + " --title " + 参_新名称)

	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置分辨率(禁引用 文本型 参_宽度, 禁引用 文本型 参_高度, 禁引用 文本型 参_DPI, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_resolution
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --resolution " + 参_宽度 + "," + 参_高度 + "," + 参_DPI)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --resolution " + 参_宽度 + "," + 参_高度 + "," + 参_DPI)

	//@参数 CPU核心数:1,2,3,4
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置CPU(禁引用 文本型 参_核心数, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_cpu
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --cpu " + 参_核心数)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --cpu " + 参_核心数)

	//@参数 内存容量(M):256,512,768,1024,1536,2048,4096,8192
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置内存(禁引用 文本型 参_内存容量, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_memory
		//  [--memory <256 | 512 | 768 | 1024 | 1536 | 2048 | 4096 | 8192>]
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --memory " + 参_内存容量)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --memory " + 参_内存容量)

	//@参数 如"Xiaomi"、"vivo"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置手机品牌(禁引用 文本型 参_手机品牌, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_manufacturer
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --manufacturer " + 参_手机品牌)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --manufacturer " + 参_手机品牌)

	//@参数 如"2203121C"表示"Xiaomi 12S Ultra",具体看模拟器设置处的机型列表
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置手机型号(禁引用 文本型 参_手机型号, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_model
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --model " + 参_手机型号)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --model " + 参_手机型号)

	//@参数 如"13800000000"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置手机号码(禁引用 文本型 参_手机号码, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_pnumber
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --pnumberl " + 参_手机号码)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --pnumber " + 参_手机号码)

	//@参数 如"auto"或"865166023949731"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置IMEI(禁引用 文本型 参_imei, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_IMEI
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --imei " + 参_imei)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --imei " + 参_imei)

	//@参数 如"auto"或"460000000000000"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置IMSI(禁引用 文本型 参_imsi, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_IMSI
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --imsi " + 参_imsi)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --imsi " + 参_imsi)

	//@参数 如"auto"或"89860000000000000000"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置SIM串口(禁引用 文本型 参_sim串口, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_SimSerial
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --simserial " + 参_sim串口)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --simserial " + 参_sim串口)

	//@参数 如"auto"或"0123456789abcdef"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置安卓ID(禁引用 文本型 参_安卓ID, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_androidID
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --androidid " + 参_安卓ID)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --androidid " + 参_安卓ID)

	//@参数 如"auto"或"000000000000"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置MAC(禁引用 文本型 参_MAC, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_MAC
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --mac " + 参_MAC)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --mac " + 参_MAC)

	//@参数 "1":开启 "0":关闭
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置屏幕自动旋转(禁引用 文本型 参_开关, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_autorotate
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --autorotate " + 参_开关)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --autorotate " + 参_开关)

	//@参数 "1":开启 "0":关闭
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置强制锁定横屏(禁引用 文本型 参_开关, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_lockwindow
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --lockwindow " + 参_开关)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --lockwindow " + 参_开关)

	//@参数 "1":开启 "0":关闭
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置root(禁引用 文本型 参_开关, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : modify_root
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "modify --index " + 参_模拟器索引 + " --root " + 参_开关)
		否则
			返回 x.取DOS执行结果(路径 + "modify --name " + 参_模拟器名称 + " --root " + 参_开关)

	//@参数 模拟器名称
	//@参数 模拟器索引
	//@参数 APK文件名,如"d:\\123.APK"
	//@参数 APK包名,如"com.tencent.mm"
	//@备注 优先匹配模拟器名称和文件名,为空则匹配索引和包名
	函数 禁引用 文本型 app安装(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "", 禁引用 文本型 参_文件名 = "", 禁引用 文本型 参_包名 = "") : installapp
		文本型 局_命令
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			局_命令 = 路径 + "installapp --index " + 参_模拟器索引 + " "
		否则
			局_命令 = 路径 + "installapp --name " + 参_模拟器名称 + " "

		如果 (参_文件名 == "" && 参_包名 == "")
			返回 "app文件名和包名不可都为空"
		否则 (参_文件名 == "")
			返回 x.取DOS执行结果(局_命令 + "--packagename " + 参_包名)
		否则
			返回 x.取DOS执行结果(局_命令 + "--filename " + 参_文件名)

	//@参数 APK包名,如"com.tencent.mm"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 app卸载(禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : uninstallapp
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "uninstallapp --index " + 参_模拟器索引 + " --packagename " + 参_包名)
		否则
			返回 x.取DOS执行结果(路径 + "uninstallapp --name " + 参_模拟器名称 + " --packagename " + 参_包名)

	//@参数 APK包名,如"com.tencent.mm"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 app启动(禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : runapp
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "runapp --index " + 参_模拟器索引 + " --packagename " + 参_包名)
		否则
			返回 x.取DOS执行结果(路径 + "runapp --name " + 参_模拟器名称 + " --packagename " + 参_包名)

	//@参数 APK包名,如"com.tencent.mm"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 app强制关闭(禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : killapp
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "killapp --index " + 参_模拟器索引 + " --packagename " + 参_包名)
		否则
			返回 x.取DOS执行结果(路径 + "killapp --name " + 参_模拟器名称 + " --packagename " + 参_包名)

	//@参数 GPS坐标,常见坐标系有GPS坐标、火星坐标、百度坐标等,自行AI或者找网站在线转换
	//@备注 优先匹配模拟器名称,为空则匹配索引.该项设置无需重启可立即生效
	函数 禁引用 文本型 动作_置定位(禁引用 文本型 参_经度, 禁引用 文本型 参_纬度, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : actionLocate
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key call.locate " + 参_经度 + "," + 参_纬度)
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key call.locate " + 参_经度 + "," + 参_纬度)

	//@参数 向指定的模拟器发送adb命令
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 adb(禁引用 文本型 参_命令行, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "")
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "adb --index " + 参_模拟器索引 + " --command " + 参_命令行)
		否则
			返回 x.取DOS执行结果(路径 + "adb --name " + 参_模拟器名称 + " --command " + 参_命令行)

	//@参数 详见安卓adb命令"setprop"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 模拟器置配置(禁引用 文本型 参_键, 禁引用 文本型 参_值, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : setprop
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "setprop --index " + 参_模拟器索引 + " --key " + 参_键 + " --value " + 参_值)
		否则
			返回 x.取DOS执行结果(路径 + "setprop --name " + 参_模拟器名称 + " --key " + 参_键 + " --value " + 参_值)

	//@参数 详见安卓adb命令"getprop"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 模拟器取配置(禁引用 文本型 参_键, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : getprop
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "getprop --index " + 参_模拟器索引 + " --key " + 参_键)
		否则
			返回 x.取DOS执行结果(路径 + "getprop --name " + 参_模拟器名称 + " --key " + 参_键)

	//@参数 0-100,限制最高频率百分比,如50表示最高只使用50%
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 置CPU最高使用率(禁引用 文本型 参_频率, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : downcpu
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "downcpu --index " + 参_模拟器索引 + " --rate " + 参_频率)
		否则
			返回 x.取DOS执行结果(路径 + "downcpu --name " + 参_模拟器名称 + " --rate " + 参_频率)

	//@参数 备份文件存放路径,如R"(C:\1)"或"C:\\1"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 模拟器备份(禁引用 文本型 参_备份路径, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : backup
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "backup --index " + 参_模拟器索引 + " --file " + 参_备份路径)
		否则
			返回 x.取DOS执行结果(路径 + "backup --name " + 参_模拟器名称 + " --file " + 参_备份路径)

	//@参数 备份文件存放路径,如R"(C:\1)"或"C:\\1"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 模拟器还原(禁引用 文本型 参_备份路径, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : restore
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "restore --index " + 参_模拟器索引 + " --file " + 参_备份路径)
		否则
			返回 x.取DOS执行结果(路径 + "restore --name " + 参_模拟器名称 + " --file " + 参_备份路径)

	//@参数 详见雷电模拟器的"action"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 动作(禁引用 文本型 参_键, 禁引用 文本型 参_值, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : action
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key " + 参_键 + " --value " + 参_值)
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key " + 参_键 + " --value " + 参_值)

	//@参数 "back"或"home"或"menu"或"volumeup"或"volumedown"
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 动作_按键(禁引用 文本型 参_键名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : actionKeyboard
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key call.keyboard --value " + 参_键名)
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key call.keyboard --value " + 参_键名)

	//@备注 优先匹配模拟器名称,为空则匹配索引,可能会有延迟,模拟器窗口不会抖动
	函数 禁引用 文本型 动作_摇一摇(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : actionShake
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key call.shake --value null")
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key call.shake--value null")

	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 动作_文字输入(禁引用 文本型 参_内容, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : actionInput
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key call.input --value " + 参_内容)
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key call.input --value " + 参_内容)

	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 动作_断开网络(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : actionNetworkOff
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key call.network --value offline")
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key call.input --value offline")

	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 动作_连接网络(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : actionNetworkOn
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key call.network --value connect")
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key call.network --value connect")

	//@参数 三维坐标系,"x,y,z"格式
	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 动作_重力感应(禁引用 文本型 参_坐标点, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : actionNetworkOn
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "action --index " + 参_模拟器索引 + " --key call.gravity --value " + 参_坐标点)
		否则
			返回 x.取DOS执行结果(路径 + "action --name " + 参_模拟器名称 + " --key call.gravity --value " + 参_坐标点)

	//@备注 优先匹配模拟器名称,为空则匹配索引.如微信,先点开扫一扫,再使用此命令
	函数 禁引用 文本型 扫描二维码(禁引用 文本型 参_二维码路径, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : scan
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "scan --index " + 参_模拟器索引 + " --file " + 参_二维码路径)
		否则
			返回 x.取DOS执行结果(路径 + "scan --name " + 参_模拟器名称 + " --file " + 参_二维码路径)

	//@备注 多开器里的排列窗口,
	函数 禁引用 文本型 模拟器窗口自动排列() : sortWnd
		返回 x.取DOS执行结果(路径 + "sortWnd")

	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 app备份(禁引用 文本型 参_备份路径, 禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : backupapp
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "backupapp --index " + 参_模拟器索引 + " --packagename " + 参_包名 + " --file " + 参_备份路径)
		否则
			返回 x.取DOS执行结果(路径 + "backupapp --name " + 参_模拟器名称 + " --packagename " + 参_包名 + " --file " + 参_备份路径)

	//@备注 优先匹配模拟器名称,为空则匹配索引
	函数 禁引用 文本型 app还原(禁引用 文本型 参_备份路径, 禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : restoreapp
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "模拟器名称和索引不可都为空"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "restoreapp --index " + 参_模拟器索引 + " --packagename " + 参_包名 + " --file " + 参_备份路径)
		否则
			返回 x.取DOS执行结果(路径 + "restoreapp --name " + 参_模拟器名称 + " --packagename " + 参_包名 + " --file " + 参_备份路径)

	//@备注 雷电模拟器多开设置
	//@参数 帧数,0-60
	//@参数 多开时关闭声音 0:开启声音 1:关闭声音
	//@参数 极致多开模式 0:关闭 1:启用
	//@参数 纯净模式,去除广告 0:关闭 1:启用
	函数 禁引用 文本型 模拟器多开设置(禁引用 文本型 参_FPS = "60", 禁引用 文本型 参_声音 = "1", 禁引用 文本型 参_极致多开模式 = "1", 禁引用 文本型 参_纯净模式 = "1") : globalsetting
		返回 x.取DOS执行结果(路径 + "globalsetting --fps " + 参_FPS + " --audio " + 参_声音 + " --fastplay " + 参_极致多开模式 + " --cleanmode " + 参_纯净模式)

	//@参数 app包名,如"com.tencent.mm"
	//@参数 优先匹配项,可空,如为空则根据索引启动模拟器
	//@参数 可空,参数1为空则匹配该参数
	//@备注 启动指定的模拟器后打开指定app
	函数 禁引用 文本型 模拟器启动EX(禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : launchEX
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "launchex --index " + 参_模拟器索引 + " --packagename " + 参_包名)
		否则
			返回 x.取DOS执行结果(路径 + "launchex --name " + 参_模拟器名称 + " --packagename " + 参_包名)

	//@备注 返回JSON文本数据
	函数 禁引用 文本型 取操作录制文件列表(禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : operatelist
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "operatelist --index " + 参_模拟器索引)
		否则
			返回 x.取DOS执行结果(路径 + "operatelist --name " + 参_模拟器名称)

	//@参数 如"操作录制1.record"
	//@备注 返回JSON文本数据
	函数 禁引用 文本型 取操作录制文件信息(禁引用 文本型 参_文件名, 禁引用 文本型 参_模拟器名称 = "", 禁引用 文本型 参_模拟器索引 = "") : operateinfo
		如果 (参_模拟器名称 == "" && 参_模拟器索引 == "")
			返回 "请至少输入一个参数"
		否则 (参_模拟器名称 == "")
			返回 x.取DOS执行结果(路径 + "operatelist --index " + 参_模拟器索引 + " --file " + 参_文件名)
		否则
			返回 x.取DOS执行结果(路径 + "operatelist --name " + 参_模拟器名称 + " --file " + 参_文件名)

	//@参数 接受返回结果的动态数组,如:
	//动态数组<文本型> a
	//参数填:&a
	//@备注 默认不带路径
	函数 禁引用 文本型 ld_取所有app包名(禁引用 动态数组<文本型>* 参_包名数组指针, 禁引用 文本型 参_模拟器索引 = "0", 逻辑型 参_是否带路径 = 假) : ld_listPackages
		文本型 局_结果
		动态数组<文本型> 局_文本数组
		如果 (参_是否带路径)
			局_结果 = x.取DOS执行结果(ld路径 + " -s " + 参_模拟器索引 + " pm list packages -f")
		否则
			局_结果 = x.取DOS执行结果(ld路径 + " -s " + 参_模拟器索引 + " pm list packages")
		局_文本数组 = 文本分割行(局_结果.取地址())
		列表循环 (整型 i = 0; 局_文本数组)
			如果 (局_文本数组[i] != "")
				(*参_包名数组指针).添加(局_文本数组[i])
		返回 局_结果

	//@备注 获取包名对应的APK路径
	函数 禁引用 文本型 ld_app包名取路径(禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器索引 = "0") : ld_pathPackageName
		返回 x.取DOS执行结果(ld路径 + "-s " + 参_模拟器索引 + " pm path " + 参_包名)

	//@备注 清理应用数据
	函数 禁引用 文本型 ld_app清理应用数据(禁引用 文本型 参_包名, 禁引用 文本型 参_模拟器索引 = "0") : ld_clear
		返回 x.取DOS执行结果(ld路径 + "-s " + 参_模拟器索引 + " pm clear " + 参_包名)

	//@参数 键名或键代码,如"3"或"KEYCODE_HOME",具体对照表可自行AI
	//@备注 模拟按键
	函数 禁引用 文本型 ld_按键(禁引用 文本型 参_键值, 禁引用 文本型 参_模拟器索引 = "0") : ld_keyevent
		返回 x.取DOS执行结果(ld路径 + "-s " + 参_模拟器索引 + " input keyevent " + 参_键值)

	//@参数 点击屏幕的X坐标
	//@参数 点击屏幕的Y坐标
	//@备注 点击屏幕指定位置,可搜索"雷电显示坐标",直接从模拟器获取坐标
	函数 禁引用 文本型 ld_点击(禁引用 文本型 参_X, 禁引用 文本型 参_Y, 禁引用 文本型 参_模拟器索引 = "0") : ld_tap
		返回 x.取DOS执行结果(ld路径 + "-s " + 参_模拟器索引 + " input tap " + 参_X + " " + 参_Y)

	//@参数 起点X
	//@参数 起点Y
	//@参数 终点X
	//@参数 终点Y
	//@参数 多久执行完(毫秒)
	//@备注 从屏幕指定位置滑动到另一指定位置,可搜索"雷电显示坐标",直接从模拟器获取坐标
	函数 禁引用 文本型 ld_滑动(禁引用 文本型 参_X1, 禁引用 文本型 参_Y1, 禁引用 文本型 参_X2, 禁引用 文本型 参_Y2, 禁引用 文本型 参_延时 = "", 禁引用 文本型 参_模拟器索引 = "0") : ld_swipe
		返回 x.取DOS执行结果(ld路径 + "-s " + 参_模拟器索引 + " input swipe " + 参_X1 + " " + 参_Y1 + " " + 参_X2 + " " + 参_Y2 + " " + 参_延时)

	//@参数 起点X
	//@参数 起点Y
	//@参数 终点X
	//@参数 终点Y
	//@参数 多久执行完(毫秒)
	//@备注 点击屏幕指定位置并拖动到另一指定位置,可搜索"雷电显示坐标",直接从模拟器获取坐标
	函数 禁引用 文本型 ld_拖动(禁引用 文本型 参_X1, 禁引用 文本型 参_Y1, 禁引用 文本型 参_X2, 禁引用 文本型 参_Y2, 禁引用 文本型 参_延时 = "", 禁引用 文本型 参_模拟器索引 = "0") : ld_draganddrop
		返回 x.取DOS执行结果(ld路径 + "-s " + 参_模拟器索引 + " input draganddrop " + 参_X1 + " " + 参_Y1 + " " + 参_X2 + " " + 参_Y2 + " " + 参_延时)

	占位
